/* Die Klasse StandardAbweichungAus berechnet die Standardabweichung
 * von jeden ausgeliehenen Buecher. Dafuer braucht es die Werte von
 * Haeufigkeit und Mittelwert von jeden ausgeliehen Buechern
 * 
 * Datei : StandardAbweichungAus.java  Autor : Kouende Steeve
 * Datum : 12.12.2011
 */

package statistik;                     /* diese package beinhaltet
                                        * alle notwendige klasse,
                                        * die zur Ausfuehrung diese 
                                        * Klasse benoetigt werden 
                                        */

import java.util.ArrayList;
import java.util.List;
import java.lang.Math;


/* 
 * die oeffentlichen Daten von der Klasse StandardAbweichungAus sind :
 * List < Integer > b_bestand : (beinhaltet wie viel mal jedes Buch
 *                              ausgeliehen ist)
 *  List <Float> b_frequenz: (beinhaltet wie viel mal jedes Buch 
 *  ausgeliehen ist im Vergleich zu anderen Buechern des gleiches 
 *  Sachgebiet)
 *  public ArrayList <Float> mittelwertAus: (wie ein Buch 
 *                    im Mittelwert ausgeliehen ist)
 *  public ArrayList <Float> standAbweichung (sammeln die Werte
 *                                          von standardabweichung)
 *                                          
 * int i,j,counter 
 * mediumSG newMediumSGSA: (beinhaltet eine Liste von alle Buecher,
 *  die im Bibliothek (nach Sachgebiete) vorhanden und ausleihbar 
 *  sind) 
 * ausMediumSG ausMediumSGSA : (beinhaltet eine Liste von allen 
 * ausgeliehenen Buechern von der Bibliothek (nach Sachgebiete))
 * 
 *  die privaten Daten von der Klasse Haufigkeit sind :
 * 
 * String s; int m; float result, h, a;
 * int count
 * float a, b, f, x , tempo (zwischenspeicher von werte);
 * die Methoden von der Klasse Haufigkeit sind :
 * 
 * public void ausgeliehenBuch ()
 * public void hauefigkeitBuch ()
 * public void mittelwert ()
 * public void standAbweichung ()
 * public void Anzeigen ()
 */

public class StandardAbweichungAus
{
  public static void main (String[] args)
  {

    StandardAbweichungAus ausStandAb = new StandardAbweichungAus (1);

    ausStandAb.ausgelieheneBuch ();
    ausStandAb.hauefigkeitBuch ();
    ausStandAb.mittelwert ();
    ausStandAb.standAbweichung ();
    ausStandAb.Anzeige ();
  }

  float buchbestand, frequenz, standAb;
  int count, i, j;
  
  mediumSG mediumSGSA ;
  ausMediumSG ausMediumSGSA ; 
  public List<Integer> b_bestand = new ArrayList ();  
  public List<Float> b_frequenz = new ArrayList ();
  public ArrayList<Float> mittelwertAus = new ArrayList<Float> ();
  public ArrayList<Float> standAbweichung = new ArrayList<Float> ();
  
  public StandardAbweichungAus (int sachgebiet)
  {
    mediumSGSA = new mediumSG (sachgebiet);
    ausMediumSGSA = new ausMediumSG (sachgebiet);
  }

  public void ausgelieheneBuch ()
  {

    for (i = 0; i <
        mediumSGSA.gibMedium ().size (); i++)
    {
      String s = (String) mediumSGSA.gibMedium ().get (i);
      int m = 0;

      for (j = 0; j <
          ausMediumSGSA.gibAusgelieheneMedium ().size (); j++)
      {
     // prueft ob ein medium ist in der ausgeliehenen List oder nicht
        if (s.equals 
            (ausMediumSGSA.gibAusgelieheneMedium ().get (j)))                                                                                                                                             
        {
       // Wenn Ja zaehlt es wie viele mal das Medium ausgeliehen ist
          m++;               
        }
      }
      b_bestand.add (m);
    }
  }

  /* Die funktion liefert, wie oft ein Buch im Vergleich zu andere
   * ausgeliehen ist
   */
  public void hauefigkeitBuch ()
  {
    float result, h, a;
    int count;

    for (count = 0; count < 
        mediumSGSA.gibMedium ().size (); count++)
    {
   // wie oft ein Buch ist ausgeliehen
      h = (float) b_bestand.get (count); 
                                         
   // die Zahl von gesamte ausgeliehenen Buecher
      a = (float) ausMediumSGSA.gibAusgelieheneMedium ().size (); 
                                           
   // Die Haeufigkeit pro Buch von ausgeliehen Buecher
      result = (float) ( (h / a) * 100); 
   // List von Haeufigkeit der ausgeliehenen Buecher                               
      b_frequenz.add (result);                                   
    }
    
  }
  // Berechung von Mittelwert 
  public void mittelwert ()
  {
    float result;
    for (count = 0; count <
        mediumSGSA.gibMedium ().size (); count++)
    {
      buchbestand = (float) b_bestand.get (count);
      frequenz = (float) b_frequenz.get (count);
      result = (float) ( (frequenz / 
          ausMediumSGSA.gibAusgelieheneMedium ().size ()) * 100);
      mittelwertAus.add (result);

    }
  }
  //Berechnung con die standardAbweichung
  public void standAbweichung ()
  {
    float a, b, f, x, tempo;
    int count;
    for (count = 0; count <
        mediumSGSA.gibMedium ().size (); count++)
    {
      a = (float) ausMediumSGSA.gibAusgelieheneMedium ().size ();
      b = (float) b_bestand.get (count);
      f = (float) b_frequenz.get (count);
      x = (float) ( (f / a) * 100);
      tempo = (float) Math.sqrt ( (1 / a) * (b - x) * (b - x) );
      standAbweichung.add (tempo);

    }
  }

  public void Anzeige ()
  {
    int count;

    for (count = 0; count < mediumSGSA.gibMedium ().size (); count++)
    {
      System.out.printf ("Buch %s hat %.2f prozent \n",
          mediumSGSA.gibMedium ().get (count), 
          standAbweichung.get (count));
    }
  }
}
